home *** CD-ROM | disk | FTP | other *** search
/ Guide to Astrology / Guide to Astrology.iso / astro_14 / esptest.pas < prev    next >
Pascal/Delphi Source File  |  1995-12-30  |  60KB  |  1,623 lines

  1. {$U+}
  2. {$B-}
  3. {$I-}
  4. {**********************************************************}
  5. {**                                                      **}
  6. {**      ESPTEST Version 1.0                             **}
  7. {**                                                      **}
  8. {**      A program to test esp                           **}
  9. {**                                                      **}
  10. {**      Copyright 1991 Phil Mosier                      **}
  11. {**                                                      **}
  12. {**      This program will lead a subject through a      **}
  13. {**      a test of their ESP and give a statistical      **}
  14. {**      evaluation of their performance                 **}
  15. {**                                                      **}
  16. {**      Turbo Pascal Version 4.0                        **}
  17. {**                                                      **}
  18. {**********************************************************}
  19. Program ESPTEST;
  20. Uses Graph,
  21.      Dos,
  22.      Crt,
  23.      ESPDRIVR,
  24.      ESPFONT,
  25.      ESPIMAGE,
  26.      ESPSCORE,
  27.      ESPPROB;
  28. Const BACK_SPACE = #8;
  29. Const RETURN     = #13;
  30. Const SPACE      = #32;
  31. Const FF         = #12;     {Form Feed}
  32. Type FILE_NAME_TYPE = String[15];
  33. Type PARAM_RECORD = Record
  34.                      GRAPH_MODE : Integer;
  35.                      BACK_COLOR : Integer;
  36.                      COLOR_OF_CARD : Char;
  37.                      GUESS_FILE_NAME : FILE_NAME_TYPE;
  38.                      SOUND_REINFORCE : Integer;
  39.                      VISUAL_REINFORCE : Integer;
  40.                      TYPE_TESt : Char;
  41.                      End;
  42. Type PARAM_FILE_TYPE = File of PARAM_RECORD;
  43. Type STRING30  = String[30];
  44. Type STRING25  = String[25];
  45. Type SELECT_ARRAY = Array[1..5] of Integer;
  46. Var PARAM_DATA : PARAM_RECORD;
  47.     GRAPHDRIVER : Integer;
  48.     MODE : Integer;
  49.     ERRORCODE : Integer;
  50.     DRIVER : Integer;
  51.     CURSOR : Pointer;
  52.     OLD_SCREEN : Pointer;
  53.     MENU_SCREEN : Pointer;
  54.     CUR_CARD : Pointer;
  55.     CARD_1 : Pointer;
  56.     CARD_2 : Pointer;
  57.     CARD_3 : Pointer;
  58.     CARD_4 : Pointer;
  59.     CARD_5 : Pointer;
  60.     SELECT_1 : Pointer;
  61.     SELECT_2 : Pointer;
  62.     SELECT_3 : Pointer;
  63.     SELECT_4 : Pointer;
  64.     SELECT_5 : Pointer;
  65.     BACK_OF_CARD : Pointer;
  66.     BLANK_CARD : Pointer;
  67.     ANSWER_CHAR: Char;
  68.     REAL_STRING : string[7];
  69.     WORK_REAL : Real;
  70.  
  71.  
  72. Procedure  USE_ROMAN_FONT;
  73. {**********************************************************}
  74. {**                                                      **}
  75. {**********************************************************}
  76. Begin
  77.      SetUserCharSize(25,32,9,16);
  78.      SetTextStyle(TriplexFont,horizdir,UserCharSize);
  79. End;
  80.  
  81. Procedure  USE_SMALL_FONT;
  82. {**********************************************************}
  83. {**                                                      **}
  84. {**********************************************************}
  85. Begin
  86.      SetUserCharSize(1,1,1,1);
  87.      SetTextStyle(SmallFont,HorizDir,UserCharSize);
  88. End;
  89.  
  90.  
  91. Procedure ERROR(MESSAGE: STRING30);
  92. {**********************************************************}
  93. {**                                                      **}
  94. {**********************************************************}
  95. Begin
  96.    GetImage(0,0,319,199,OLD_SCREEN^);
  97.    Cleardevice;
  98.    USE_ROMAN_FONT;
  99.    Moveto(20,100);
  100.    OutText(MESSAGE);
  101.    If ((PARAM_DATA.SOUND_REINFORCE  = 1) Or
  102.       (PARAM_DATA.SOUND_REINFORCE = 2) Or
  103.       (PARAM_DATA.SOUND_REINFORCE = 3)) Then
  104.       Begin
  105.         Sound(440);
  106.         Delay(500);
  107.         NoSound;
  108.      End;
  109.      If ((PARAM_DATA.SOUND_REINFORCE = 1) Or
  110.         (PARAM_DATA.SOUND_REINFORCE = 2) Or
  111.         (PARAM_DATA.SOUND_REINFORCE = 3)) Then
  112.        Delay(1500)
  113.      Else Delay(2000);
  114.      ClearDevice;
  115.      PutImage(0,0,OLD_SCREEN^,NormalPut);
  116.   End;
  117.  
  118. Procedure INITIALIZE;
  119.  
  120. {************************************************}
  121. {**                                            **}
  122. {**  This procedure initializes the computer   **}
  123. {**  setings                                   **}
  124. {**                                            **}
  125. {************************************************}
  126. Var PARAM_FILE : PARAM_FILE_TYPE;
  127.     IOCODE: Integer;
  128.     NOTICE : String[26];
  129. Begin;                                 {Display_title }
  130.     NOTICE  := ('  (C) 1991 by Phil Mosier ');
  131.     If RegisterBGIdriver(@CGADriverProc) < 0 Then
  132.        Begin
  133.           WriteLn('Error registering driver: ',
  134.           GraphErrorMsg(GraphResult));
  135.           Halt(1);
  136.        End;
  137.     If RegisterBGIFont(@TriplexFontProc) < 0 Then
  138.        Begin
  139.           WriteLn('Error registering font: ',
  140.           GraphErrorMsg(GraphResult));
  141.           Halt(1);
  142.        End;
  143.     If RegisterBGIFont(@SmallFontProc) < 0 Then
  144.        Begin
  145.           WriteLn('Error registering font: ',
  146.           GraphErrorMsg(GraphResult));
  147.           Halt(1);
  148.        End;
  149.  
  150.     GRAPHDRIVER := Detect;
  151.     DRIVER := CGA;
  152.     MODE := CGAC1;
  153.     InitGraph (DRIVER, MODE, '');
  154.     ERRORCODE := GraphResult;
  155.     If ERRORCODE <> GrOK Then
  156.        Begin
  157.           WriteLn('Graphics error : ', GraphErrorMsg(ERRORCODE));
  158.           WriteLn('(You probably don''t have a graphics card!)');
  159.           WriteLn('Program aborted...');
  160.           Halt(1);
  161.        End;
  162.     ASSIGN(PARAM_FILE,'ESPPARAM.DAT');
  163.     {$I-}
  164.     ReSet(PARAM_FILE);
  165.     {$I+}
  166.     IOCODE := IOResult;
  167.     If IOCODE <> 0 Then
  168.        If IOCODE = 2 Then
  169.        Begin
  170.           MoveTo(0,20);
  171.           OutText('Opening New File');
  172.           Delay(5000);
  173.           PARAM_DATA.GRAPH_MODE   := 1;
  174.           PARAM_DATA.BACK_COLOR   := 1;       {Blue}
  175.           PARAM_DATA.COLOR_OF_CARD  := '2';
  176.           PARAM_DATA.GUESS_FILE_NAME := 'NONAME.ESP';
  177.           PARAM_DATA.SOUND_REINFORCE := 1;
  178.           PARAM_DATA.VISUAL_REINFORCE := 1;
  179.           PARAM_DATA.TYPE_TEST := 'C';
  180.           {$I-}
  181.           ReWrite(PARAM_FILE);
  182.           IOCODE := IoResult;
  183.           {$i+}
  184.           If IOCODE <> 0 Then Begin
  185.             MoveTo(0,40);
  186.             OutText('Unable to write file!');
  187.             Delay(1500);
  188.           End
  189.           Else
  190.           Begin
  191.              Write(PARAM_FILE,PARAM_DATA);
  192.              Close(PARAM_FILE);
  193.           End
  194.        End
  195.        Else
  196.        Begin
  197.           MoveTo(10,30);
  198.           OutText('Disk problems');
  199.           Delay(5000);
  200.           Halt(1);
  201.        End
  202.     Else
  203.        Begin         {  If IOCODE = 0 }
  204.           Read(PARAM_FILE,PARAM_DATA);
  205.           Close(PARAM_FILE);
  206.        End;
  207.  
  208.     SetGraphMode(PARAM_DATA.GRAPH_MODE);
  209.     SetBkColor(PARAM_DATA.BACK_COLOR);
  210.     SetViewPort(0,0,GetMaxX,GetMaxY,ClipOn);
  211.     GetMem(CURSOR,ImageSize(1,1,8,10));
  212.     GetImage(1,1,8,10,CURSOR^);
  213.     GetMem(OLD_SCREEN,ImageSize(0,0,319,199));
  214.     GetMem(MENU_SCREEN,imagesize(0,0,319,199));
  215.     GetMem(CUR_CARD,ImageSize(0,0,60,90));
  216.     GetMem(CARD_1,ImageSize(0,0,60,90));
  217.     GetMem(CARD_2,ImageSize(0,0,60,90));
  218.     GetMem(CARD_3,ImageSize(0,0,60,90));
  219.     GetMem(CARD_4,ImageSize(0,0,60,90));
  220.     GetMem(CARD_5,ImageSize(0,0,60,90));
  221.     GetMem(SELECT_1,ImageSize(0,0,26,26));
  222.     GetMem(SELECT_2,ImageSize(0,0,26,26));
  223.     GetMem(SELECT_3,ImageSize(0,0,26,26));
  224.     GetMem(SELECT_4,ImageSize(0,0,26,26));
  225.     GetMem(SELECT_5,ImageSize(0,0,26,26));
  226.     GetMem(BLANK_CARD,ImageSize(0,0,60,90));
  227.     GetMem(BACK_OF_CARD,ImageSize(0,0,60,90));
  228.     GetImage(0,0,60,90,BLANK_CARD^);
  229. END;                                   {Display_title }
  230.  
  231.  
  232. Procedure TITLE;
  233.  
  234. {************************************************}
  235. {**                                            **}
  236. {**  This procedure prints the title of the    **}
  237. {**  program                                   **}
  238. {**                                            **}
  239. {************************************************}
  240.  
  241. BEGIN;                                 {Display_title }
  242.      USE_ROMAN_FONT;
  243.      MoveTo(0,0);
  244.      OutText(' E S P T E S T');
  245.      Use_Small_Font;
  246.      Moveto(190,0);
  247.      OutText('(C) 1991 Phil Mosier ');
  248.      MoveTo(190,10);
  249.      Line(90,70,150,70);             { card back }
  250.      Line(90,70,90,160);
  251.      Line(150,70,150,160);
  252.      Line(90,160,150,160);
  253.      SetFillStyle(6,GetMaxColor);
  254.      FloodFill(95,75,GetMaxColor);
  255.      GetImage(90,70,150,160,BACK_OF_CARD^);
  256.      SetFillStyle(SolidFill,GetMaxColor);
  257.      Delay(1000);
  258.      PutImage(90,70,BLANK_CARD^,3);
  259.      Delay(2000);
  260.      Line(90,70,150,70);             { card 1 }
  261.      Line(90,70,90,160);
  262.      Line(150,70,150,160);
  263.      Line(90,160,150,160);
  264.      Image_1(95,90,1.0);
  265.      GetImage(90,70,150,160,CARD_1^);
  266.      Delay(700);
  267.      PutImage(130,40,BLANK_CARD^,3);
  268.      Line(130,40,190,40);             { card 2 }
  269.      Line(130,40,130,130);
  270.      Line(190,40,190,130);
  271.      Line(130,130,190,130);
  272.      Image_2(135,60,1.0);
  273.      GetImage(130,40,190,130,CARD_2^);
  274.      Delay(1600);
  275.      PutImage(45,25,BLANK_CARD^,3);
  276.      Line(45,25,105,25);             { card 3 }
  277.      Line(45,25,45,115);
  278.      Line(105,25,105,115);
  279.      Line(45,115,105,115);
  280.      IMAGE_3(50,45,1.0);
  281.      GetImage(45,25,105,115,CARD_3^);
  282.      Delay(800);
  283.      PutImage(220,70,BLANK_CARD^,3);
  284.      Line(220,70,280,70);             { card 4 }
  285.      Line(220,70,220,160);
  286.      Line(280,70,280,160);
  287.      Line(220,160,280,160);
  288.      IMAGE_4(225,90,1.0);
  289.      GetImage(220,70,280,160,CARD_4^);
  290.      Delay(800);
  291.      PutImage(175,20,BLANK_CARD^,3);
  292.      Line(175,20,235,20);             { card 5 }
  293.      Line(175,20,175,110);
  294.      Line(235,20,235,110);
  295.      Line(175,110,235,110);
  296.      IMAGE_5(180,40,1.0);
  297.      GetImage(175,20,235,110,card_5^);
  298.      Delay(1600);
  299.      MoveTo(0,185);
  300.      If ((PARAM_DATA.SOUND_REINFORCE = 1) Or
  301.          (PARAM_DATA.SOUND_REINFORCE = 2) Or
  302.          (PARAM_DATA.SOUND_REINFORCE = 3))  Then
  303.         SONG;
  304.      OutText('Press any key ');
  305.      ANSWER_CHAR :=  ReadKey;
  306.  
  307. END;                                   {Display_title }
  308.  
  309. Procedure MAIN_MENU(Var MAIN_SELECTION : Char );
  310. {**********************************************************}
  311. {**                                                      **}
  312. {**                                                      **}
  313. {**********************************************************}
  314.  
  315.  
  316. Procedure GET_STRING(Var X_PLACE : Integer;
  317.                      Var Y_PLACE : Integer;
  318.                      Var INPUT_INDEX : Byte;
  319.                      Var INPUT_STRING : STRING25;
  320.                      Var RETURN_ON : Boolean;
  321.                          STRING_LENGTH : Byte);
  322. {******************* Get String  ******************}
  323. Var EXIT_FLAG : Boolean;
  324.     OKAY_FLAG : Boolean;
  325.     ANSWER_CHAR : Char;
  326.     SHORT_CASE_FLAG : Boolean;
  327.     SAVE_INDEX : Byte;
  328. Begin
  329.     USE_SMALL_FONT;
  330.     EXIT_FLAG :=False;
  331.     RETURN_ON := False;
  332.     INPUT_STRING := '        ';
  333.     INPUT_INDEX := 1;
  334.     Repeat
  335.        PutImage(X_PLACE,Y_PLACE,CURSOR^,4);
  336.        OKAY_FLAG := False;
  337.        Repeat
  338.           ANSWER_CHAR := UpCase(Readkey);
  339.           OKAY_FLAG := True;
  340.           If (ANSWER_CHAR In ['.','"','/','\','[',']',':',
  341.              ';','|','<','>','+','=',',','*','?'])
  342.              Then begin
  343.                 OKAY_FLAG := False;
  344.                 ERROR('Not a valid character');
  345.                 USE_SMALL_FONT
  346.              End;
  347.           If Not (ANSWER_CHAR In ['A'..'Z','a'..'z','0'..'9',
  348.              '-','_','(',')','&','^','%','$','#','@','!',
  349.              '{','}',BACK_SPACE,RETURN])
  350.              Then Begin
  351.                OKAY_FLAG := False;
  352.                ERROR('Not a valid character');
  353.                USE_SMALL_FONT
  354.              End;
  355.        Until OKAY_FLAG;
  356.        If (ANSWER_CHAR = BACK_SPACE)
  357.           Then Begin
  358.              If INPUT_INDEX = 1 Then
  359.                 Begin
  360.                    EXIT_FLAG := True;
  361.                    RETURN_ON := True;
  362.                 End;
  363.              If INPUT_INDEX > 1 Then
  364.                 Begin
  365.                    INPUT_INDEX := INPUT_INDEX - 1;
  366.                    INPUT_STRING[INPUT_INDEX] := ' ';
  367.                    PutImage(X_PLACE,Y_PLACE,CURSOR^,3);
  368.                    X_PLACE := X_PLACE - 6;
  369.                    PutImage(X_PLACE,Y_PLACE,CURSOR^,4);
  370.                 End;
  371.            End
  372.          Else
  373.            Begin
  374.              If ANSWER_CHAR <> RETURN Then
  375.              Begin
  376.                 PutImage(X_PLACE,Y_PLACE,CURSOR^,3);
  377.                 MoveTo(X_PLACE,Y_PLACE);
  378.                 OutText(ANSWER_CHAR);
  379.                 INPUT_STRING[INPUT_INDEX] := ANSWER_CHAR;
  380.                 X_PLACE := X_PLACE + 6;
  381.                 INPUT_INDEX := INPUT_INDEX + 1;
  382.                 PutImage(X_PLACE,Y_PLACE,CURSOR^,4);
  383.              End;
  384.            End;
  385.          SHORT_CASE_FLAG := False;
  386.          If INPUT_INDEX < 3 Then
  387.             Begin
  388.             SAVE_INDEX := INPUT_INDEX;
  389.             INPUT_INDEX := 3;
  390.             SHORT_CASE_FLAG := True;
  391.             End;
  392.          If (((INPUT_STRING[INPUT_INDEX - 2] = ' ') And
  393.             (ANSWER_CHAR = ' ') And (Not SHORT_CASE_FLAG)) Or
  394.             (INPUT_INDEX > STRING_LENGTH) Or
  395.             (ANSWER_CHAR = RETURN )) Then
  396.               Begin
  397.                  EXIT_FLAG := True;
  398.               End;
  399.          If SHORT_CASE_FLAG Then INPUT_INDEX := SAVE_INDEX;
  400.          If ((INPUT_INDEX = 1) And (ANSWER_CHAR = RETURN)) Then
  401.             Begin
  402.                EXIT_FLAG := True;
  403.                RETURN_ON := True;
  404.             End;
  405.        Until EXIT_FLAG;
  406.        PutImage(X_PLACE,Y_PLACE,CURSOR^,3);
  407.      End; {GET_STRING}
  408.  
  409.  
  410.     Procedure CHANGE_DEFAULTS(Var CHANGE_SELECTION:Char);
  411.     {**********************************************************}
  412.     {**                                                      **}
  413.     {**   CHANGE_DEFAULTS                                    **}
  414.     {**                                                      **}
  415.     {**********************************************************}
  416.     Var PARAM_FILE : PARAM_FILE_TYPE;
  417.         IOCODE : integer;
  418.         SUB_ANSWER : Char;
  419.         OKEY_FLAG : Boolean;
  420.         NEW_STRING_FLAG : Boolean;
  421.         TOP_NUM : Char;
  422.         BOTTEM_NUM : Char;
  423.         INPUT_NUM : Byte;
  424.         TEMP_STRING3 : String[3];
  425.         TEMP_STRING8 : String[8];
  426.         LETTER_COUNT : Integer;
  427.         EXIT_FLAG : Boolean;
  428.         TEMP_LESSON_FILE_NAME : FILE_NAME_TYPE;
  429.         X_PLACE : Integer;
  430.         Y_PLACE : Integer;
  431.         STRING_LENGTH : Byte;
  432.         INPUT_INDEX : Byte;
  433.         INPUT_STRING : STRING25;
  434.         RETURN_ON : Boolean;
  435.     Begin
  436.        ClearDevice;
  437.        USE_ROMAN_FONT;
  438.        MoveTo(0,0);
  439.        OutText('C Color is');
  440.        MoveTo(130,0);
  441.        Case PARAM_DATA.BACK_COLOR Of
  442.            4 : OutText('RED');
  443.            1 : OutText('BLUE');
  444.            0 : OutText('BLACK');
  445.        End;
  446.        MoveTo(0,20);
  447.        OutText('S Sound Reinforcing  ' );
  448.        MoveTo(255,20);
  449.        Case PARAM_DATA.SOUND_REINFORCE  Of
  450.           1 : OutText('ALL ');
  451.           2 : OutText('HIT ');
  452.           3 : OutText('MISS');
  453.           4 : OutText('NONE');
  454.        End;
  455.        MoveTo(0,40);
  456.        OutText('V Visual Reinforcing  ');
  457.        MoveTo(255,40);
  458.        Case PARAM_DATA.VISUAL_REINFORCE  Of
  459.           1 : OutText('ALL ');
  460.           2 : OutText('HIT ');
  461.           3 : OutText('MISS');
  462.           4 : OutText('NONE');
  463.        End;
  464.        MoveTo(0,60);
  465.        OutText('T Type is');
  466.        MoveTo(130,60);
  467.        If PARAM_DATA.TYPE_TEST = 'C' Then
  468.        OutText('CLARIVOYANCE')
  469.        Else
  470.           OutText('PRECOGNITION');
  471.        MoveTo(0,80);
  472.        OutText('F File of scores');
  473.        MoveTo(50,100);
  474.        OutText(PARAM_DATA.GUESS_FILE_NAME);
  475.        MoveTo(0,120);
  476.        OutText('Q Quit');
  477.        Line(0,140,310,140);
  478.        OKEY_FLAG := False;
  479.        Repeat
  480.            ANSWER_CHAR := Readkey;
  481.            ANSWER_CHAR := UpCase(ANSWER_CHAR);
  482.            If (ANSWER_CHAR In ['C','S','V','T','F','Q'])
  483.            Then OKEY_FLAG := True
  484.            Else ERROR(' not C, S, V, T, F, or Q');
  485.        Until OKEY_FLAG;
  486.        CHANGE_SELECTION := ANSWER_CHAR;
  487.        USE_SMALL_FONT;
  488.        Case ANSWER_CHAR Of
  489.           'C': Begin
  490.                MoveTo(0,150);
  491.                OutText('Do you want:  1  RED');
  492.                MoveTo(75,160);
  493.                OutText(' 2  BLUE');
  494.                MoveTo(75,170);
  495.                OutText(' 3  BLACK');
  496.                OKEY_FLAG := False;
  497.                Repeat
  498.                   SUB_ANSWER := ReadKey;
  499.                   If (SUB_ANSWER In ['1','2','3']) Then
  500.                      OKEY_FLAG := True
  501.                   Else ERROR('not 1 2 or 3');
  502.                Until OKEY_FLAG;
  503.                PARAM_DATA.GRAPH_MODE   := 1;
  504.                Case SUB_ANSWER Of
  505.                       '1' : Begin
  506.                               PARAM_DATA.BACK_COLOR := 4;
  507.                               PARAM_DATA.COLOR_OF_CARD := '1';
  508.                             End;
  509.                       '2' : Begin
  510.                               PARAM_DATA.BACK_COLOR := 1;
  511.                               PARAM_DATA.COLOR_OF_CARD := '2';
  512.                            End;
  513.                       '3' : Begin
  514.                               PARAM_DATA.BACK_COLOR := 0;
  515.                               PARAM_DATA.COLOR_OF_CARD := '3';
  516.                             End;
  517.                       End;
  518.                End;
  519.           'S': Begin
  520.                MoveTo(0,150);
  521.                OutText('Do you want a Sound to tell when you''re right?');
  522.                MoveTo(220,160);
  523.                OutText('1  ALL ');
  524.                MoveTo(220,170);
  525.                OutText('2  HIT ');
  526.                MoveTo(220,180);
  527.                OutText('3  MISS');
  528.                MoveTo(220,190);
  529.                OutText('4  NONE');
  530.                OKEY_FLAG := False;
  531.                Repeat
  532.                   SUB_ANSWER := ReadKey;
  533.                   If (SUB_ANSWER In ['1','2','3','4']) Then
  534.                      Begin
  535.                         Case SUB_ANSWER of
  536.                            '1': PARAM_DATA.SOUND_REINFORCE := 1;
  537.                            '2': PARAM_DATA.SOUND_REINFORCE := 2;
  538.                            '3': PARAM_DATA.SOUND_REINFORCE := 3;
  539.                            '4': PARAM_DATA.SOUND_REINFORCE := 4;
  540.                         End;
  541.                         OKEY_FLAG := True;
  542.                      End
  543.                   Else ERROR('not 1, 2, 3 or 4');
  544.                Until OKEY_FLAG;
  545.                End;
  546.           'V': Begin
  547.                   MoveTo(0,150);
  548.                   OutText('Do you want to see if you''re right?');
  549.                   MoveTo(220,160);
  550.                   OutText('1  ALL ');
  551.                   MoveTo(220,170);
  552.                   OutText('2  HIT ');
  553.                   MoveTo(220,180);
  554.                   OutText('3  MISS');
  555.                   MoveTo(220,190);
  556.                   OutText('4  NONE');
  557.                   OKEY_FLAG := False;
  558.                   Repeat
  559.                      SUB_ANSWER := ReadKey;
  560.                      If (SUB_ANSWER In ['1','2','3','4']) Then
  561.                         Begin
  562.                         Case SUB_ANSWER Of
  563.                          '1': PARAM_DATA.VISUAL_REINFORCE := 1;
  564.                          '2': PARAM_DATA.VISUAL_REINFORCE := 2;
  565.                          '3': PARAM_DATA.VISUAL_REINFORCE := 3;
  566.                          '4': PARAM_DATA.VISUAL_REINFORCE := 4;
  567.                         End;
  568.                         OKEY_FLAG := True;
  569.                         End
  570.                      Else ERROR(' not 1, 2, 3 or 4');
  571.                   Until OKEY_FLAG ;
  572.                End;
  573.           'T': Begin
  574.                MoveTo(0,150);
  575.                OutText('What Type of test do you want?');
  576.                MoveTo(220,170);
  577.                OutText('1  CLARIVOYANCE');
  578.                MoveTo(220,180);
  579.                OutText('2  PRECOGNITION');
  580.                OKEY_FLAG := False;
  581.                Repeat
  582.                   SUB_ANSWER := ReadKey;
  583.                   If (SUB_ANSWER In ['1','2']) Then
  584.                      Begin
  585.                         Case SUB_ANSWER Of
  586.                          '1': PARAM_DATA.TYPE_TEST := 'C';
  587.                          '2': PARAM_DATA.TYPE_TEST := 'P';
  588.                         End;
  589.                         OKEY_FLAG := True;
  590.                         End
  591.                      Else ERROR(' not 1 OR 2');
  592.                   Until OKEY_FLAG;
  593.                End;
  594.           'F': Begin
  595.                   TEMP_LESSON_FILE_NAME := PARAM_DATA.GUESS_FILE_NAME;
  596.                   PARAM_DATA.GUESS_FILE_NAME :=
  597.                    '                                   ';
  598.                   MoveTo(0,150);
  599.                   OutText('Enter the file name for scores to be saved.');
  600.                   MoveTo(0,160);
  601.                   OutText('Name could be up to 8 letters long');
  602.                   MoveTo(120,170);
  603.                   OutText('12345678');
  604.                   NEW_STRING_FLAG := False;
  605.                   EXIT_FLAG := False;
  606.                   Repeat
  607.                      X_PLACE := 120;
  608.                      Y_PLACE := 180;
  609.                      STRING_LENGTH := 8;
  610.                      GET_STRING(X_PLACE,Y_PLACE,INPUT_INDEX,INPUT_STRING,
  611.                         RETURN_ON, STRING_LENGTH);
  612.                      TEMP_STRING8 := INPUT_STRING;
  613.                      If Not RETURN_ON Then
  614.                         NEW_STRING_FLAG := True;
  615.                      If RETURN_ON THEN
  616.                         Begin
  617.                         PutImage(X_PLACE,Y_PLACE,CURSOR^,3);
  618.                         X_PLACE := 192;
  619.                         For LETTER_COUNT := 8 DownTo 1 Do
  620.                            Begin
  621.                            X_PLACE := X_PLACE - 8;
  622.                            PutImage(X_PLACE,Y_PLACE,CURSOR^,3);
  623.                            End;
  624.                         NEW_STRING_FLAG :=False;
  625.                         End;
  626.                      If NEW_STRING_FLAG Then
  627.                         Begin
  628.                         If (Pos(' ',TEMP_STRING8) = 0) Then
  629.                               PARAM_DATA.GUESS_FILE_NAME :=
  630.                               TEMP_STRING8+'.ESP';
  631.                         If (Pos(' ',TEMP_STRING8) > 0) Then
  632.                               PARAM_DATA.GUESS_FILE_NAME :=
  633.                               Concat(Copy(TEMP_STRING8,1,
  634.                               (Pos(' ',TEMP_STRING8)) -1),'.ESP');
  635.                         End
  636.                      Else
  637.                         Begin
  638.                         EXIT_FLAG := True;
  639.                         PARAM_DATA.GUESS_FILE_NAME := TEMP_LESSON_FILE_NAME;
  640.                      End;
  641.                   Until (EXIT_FLAG Or NEW_STRING_FLAG);
  642.              End;
  643.           'Q': CHANGE_SELECTION := 'Q';
  644.        End;
  645.        If ANSWER_CHAR = 'Q' Then
  646.        Begin
  647.           Assign(PARAM_FILE,'ESPPARAM.DAT');
  648.           {$I-}
  649.           ReWrite(PARAM_FILE);
  650.           {$I+}
  651.           IOCODE := IoResult;
  652.           If IOCODE <> 0 Then
  653.              Begin
  654.              ERROR ('Disk problems writing file');
  655.              Delay(1000);
  656.              MAIN_SELECTION := 'Q';
  657.              End
  658.           Else Begin
  659.              Write(PARAM_FILE,PARAM_DATA);
  660.              Close(PARAM_FILE);
  661.           End
  662.        End;
  663.        SetGraphMode(PARAM_DATA.GRAPH_MODE);
  664.        SetBkColor(PARAM_DATA.BACK_COLOR);
  665.  
  666.     End;                                   {CHANGE_DEFAULTS}
  667.  
  668.     Procedure TEST(Var TEST_SELECTION : Char);
  669.     {**********************************************************}
  670.     {**                                                      **}
  671.     {**      Declaration of TEST                             **}
  672.     {**                                                      **}
  673.     {**********************************************************}
  674.     Procedure RANDOM_SELECTS(Var SELECTS_RAND_NOS:SELECT_ARRAY);
  675.     {**********************************************************}
  676.     {**                                                      **}
  677.     {**********************************************************}
  678.     Var TEMP : Integer;
  679.         SELECTS_INDEX : Integer;
  680.         LIST : Array[1..5] of Integer;
  681.     Begin
  682.        USE_SMALL_FONT;
  683.        MoveTo(44,164);
  684.        OutText('1      2      3     4      5      Q');
  685.        MoveTo(250,183);
  686.        OutText('QUIT');
  687.        Line(40,160,280,160);
  688.        Line(40,160,40,199);
  689.        Line(80,160,80,199);
  690.        Line(120,160,120,199);
  691.        Line(160,160,160,199);
  692.        Line(200,160,200,199);
  693.        Line(240,160,240,199);
  694.        Line(280,160,280,199);
  695.        Line(40,199,280,199);
  696.        Randomize;
  697.        For TEMP := 5 DownTo 1 Do
  698.           LIST[TEMP]:= TEMP;
  699.  
  700. {***  PULLS NUMBERS FROM LIST[1..5] AT RANDOM AND PUTS THEM   **}
  701. {**   IN SELECTS_RAND_NOS[1..5]                               **}
  702.  
  703.        For TEMP := 5 DownTo 1 Do
  704.           Begin
  705.             SELECTS_INDEX := Random(TEMP) + 1;
  706.             SELECTS_RAND_NOS[TEMP] := LIST[SELECTS_INDEX];
  707.             If SELECTS_INDEX < 5 Then
  708.                Begin
  709.                   Repeat
  710.                      SELECTS_INDEX := SELECTS_INDEX + 1;
  711.                      LIST[SELECTS_INDEX - 1] := LIST[SELECTS_INDEX]
  712.                   Until SELECTS_INDEX = 5;
  713.                End
  714.            End;
  715.  
  716. {***  THIS PUTS THE IMAGES IN POSITIONS DISCRIBED BY THE VALUES IN  **}
  717. {***  SELECTS_RAND_NOS[1..5]                                        **}
  718.  
  719.         For Temp := 1 To 5 Do
  720.           Begin
  721.              Case SELECTS_RAND_NOS[TEMP] Of
  722.                 1 : PutImage((10 + (TEMP * 40)),172,SELECT_1^,0);
  723.                 2 : PutImage((10 + (TEMP * 40)),172,SELECT_2^,0);
  724.                 3 : PutImage((10 + (TEMP * 40)),172,SELECT_3^,0);
  725.                 4 : PutImage((10 + (TEMP * 40)),172,SELECT_4^,0);
  726.                 5 : PutImage((10 + (TEMP * 40)),172,SELECT_5^,0);
  727.               End;  { Case  }
  728.           End;
  729.         End;
  730.     Procedure LAY_DOWN(Var POSITION : Integer);
  731.     {**********************************************************}
  732.     {**                                                      **}
  733.     {**********************************************************}
  734.     Begin
  735.         POSITION := POSITION + (Random(2) + 1);
  736.         If POSITION > 3 Then POSITION := POSITION - 3;
  737.         Case POSITION Of
  738.           1 : PutImage(130,40,BACK_OF_CARD^,0);
  739.           2 : PutImage(220,60,BACK_OF_CARD^,0);
  740.           3 : PutImage(175,20,BACK_OF_CARD^,0);
  741.           End ;
  742.     End;
  743.     {**********************************************************}
  744.     {**   Body of TEST                                       **}
  745.     {**********************************************************}
  746.     Var TEST_CHOICE : Char;
  747.     OKAY_FLAG : Boolean;
  748.     TEST_INDEX : Integer;
  749.     SELECTS_RAND_NOS : SELECT_ARRAY;
  750.     TARGET : Integer;
  751.     POSITION : Integer;
  752.     SHOW_POS : Integer;
  753.     X_POS : Integer;
  754.     Y_POS : Integer;
  755.     INDEX : Integer;
  756.     INDEX2 : Integer;
  757.     HIT_FLAG : Boolean;
  758.     TEST_CALL : Integer;
  759.     TEMP : String[2];
  760.     D_GUESS : Char;
  761.     D_HIT_MISS : Char;
  762.     D_START_HOUR : Word;
  763.     D_START_MIN : Word;
  764.     D_START_SEC : Word;
  765.     D_START_100_SEC : Word;
  766.     END_HOUR : Word;
  767.     END_MIN : Word;
  768.     END_SEC : Word;
  769.     END_100_SEC : Word;
  770.     CARRY_HOUR : Word;
  771.     CARRY_MIN : Word;
  772.     D_CUR_YEAR : Word;
  773.     D_CUR_MONTH : Word ;
  774.     D_CUR_DAY : Word ;
  775.     D_COLOR_OF_CARD : Char;
  776.     D_SCREEN_DISPLAY1 : Char ;
  777.     D_SCREEN_DISPLAY2 : Char ;
  778.     D_SCREEN_DISPLAY3 : Char ;
  779.     D_SCREEN_DISPLAY4 : Char ;
  780.     D_SCREEN_DISPLAY5 : Char ;
  781.     D_REINFORCE_VISUAL : Char;
  782.     D_REINFORCE_SOUND : Char;
  783.     D_STYLE : Char;
  784.     D_ELAPESED_SEC : LongInt;
  785.     CUR_DAYOFWEEK : Word ;
  786.     ELAPESED_HOUR : Word ;
  787.     ELAPESED_MIN  : Word ;
  788.     ELAPESED_SEC : Word ;
  789.     D_TARGET : Char;
  790.     D_NAME1 : Char;
  791.     D_NAME2 : Char;
  792.     D_NAME3 : Char;
  793.     D_NAME4 : Char;
  794.     D_NAME5 : Char;
  795.     D_NAME6 : Char;
  796.     D_NAME7 : Char;
  797.     D_NAME8 : Char;
  798.     WRITE_OK : Boolean;
  799.     Begin                                  {TEST}
  800.        Randomize;
  801.        POSITION := 1;
  802.        TEST_CALL := 0;
  803.        ClearDevice;
  804.        Repeat
  805.           TEST_CALL := TEST_CALL + 1;
  806.           RANDOM_SELECTS(SELECTS_RAND_NOS);
  807.           If PARAM_DATA.TYPE_TEST = 'C' Then
  808.              Begin
  809.                TARGET := Random(5) + 1;
  810.                LAY_DOWN(POSITION);
  811.              End;
  812.           GetTime(D_START_HOUR,D_START_MIN,D_START_SEC,D_START_100_SEC);
  813.           GetDate(D_CUR_YEAR,D_CUR_MONTH,D_CUR_DAY,CUR_DAYOFWEEK);
  814.           OKAY_FLAG := False;
  815.           Repeat
  816.              TEST_CHOICE := UpCase(ReadKey);
  817.              If TEST_CHOICE In ['1','2','3','4','5','Q'] Then
  818.                 OKAY_FLAG := True
  819.              Else
  820.                 ERROR('  Must be 1 2 3 4 5 or Q  ');
  821.           Until OKAY_FLAG;
  822.           GetTime(END_HOUR,END_MIN,END_SEC,END_100_SEC);
  823.           CARRY_MIN := 0;
  824.           CARRY_HOUR := 0;
  825.           ELAPESED_SEC := 0;
  826.           ELAPESED_MIN := 0;
  827.           ELAPESED_HOUR := 0;
  828.           If END_SEC < D_START_SEC Then
  829.              Begin
  830.                 CARRY_MIN := 1;
  831.                 ELAPESED_SEC := 60 + END_SEC - D_START_SEC;
  832.              End
  833.           Else
  834.              ELAPESED_SEC := END_SEC - D_START_SEC;
  835.           If END_MIN < D_START_MIN  Then
  836.              Begin
  837.                CARRY_HOUR := 1;
  838.                ELAPESED_MIN := 60 + END_MIN - D_START_MIN -
  839.                                CARRY_MIN;
  840.              END
  841.              Else
  842.                 ELAPESED_MIN := END_MIN - D_START_MIN - CARRY_MIN;
  843.          If END_HOUR < D_START_HOUR Then
  844.             Begin
  845.                { NO WAY TO DEAL WITH PAUSES GREATER THAN 24 HR }
  846.                ELAPESED_HOUR := 24 + END_HOUR - D_START_HOUR -
  847.                   CARRY_HOUR;
  848.             End
  849.          Else
  850.             ELAPESED_HOUR := END_HOUR - D_START_HOUR - CARRY_HOUR;
  851.           ELAPESED_SEC := (ELAPESED_HOUR * 3600)
  852.                           + (ELAPESED_MIN * 60)
  853.                            + ELAPESED_SEC;
  854.           If TEST_CHOICE <> 'Q' Then
  855.              Begin
  856.                 If (PARAM_DATA.TYPE_TEST = 'P')  Then
  857.                    Begin
  858.                       TARGET := Random(5) + 1;
  859.                       LAY_DOWN(POSITION);
  860.                       Delay(500);
  861.                    End;
  862.                 Case POSITION Of
  863.                    1 : PutImage(130,40,BLANK_CARD^,3);
  864.                    2 : PutImage(220,60,BLANK_CARD^,3);
  865.                    3 : PutImage(175,20,BLANK_CARD^,3);
  866.                 End ;
  867.                 SHOW_POS := Random(2) + 1;
  868.                 If SHOW_POS = 1 Then
  869.                    Begin
  870.                       X_POS := 90;
  871.                       Y_POS := 60;
  872.                    End
  873.                 Else
  874.                    Begin
  875.                       X_POS := 45;
  876.                       Y_POS := 25;
  877.                 End;
  878.                 HIT_FLAG := False;
  879.                 If ((Ord(TEST_CHOICE) - 48) = TARGET) Then
  880.                    HIT_FLAG := True;
  881.                 If (((PARAM_DATA.SOUND_REINFORCE = 1) And HIT_FLAG) Or
  882.                   ((PARAM_DATA.SOUND_REINFORCE = 2) And (HIT_FLAG)))
  883.                   Then
  884.                   Begin
  885.                      Sound(1760);
  886.                      Delay(1000);
  887.                      NoSound;
  888.                      Delay(500);
  889.                   End;
  890.                If (((PARAM_DATA.SOUND_REINFORCE = 1) And (Not HIT_FLAG)) Or
  891.                   ((PARAM_DATA.SOUND_REINFORCE = 3) And (Not HIT_FLAG)))
  892.                   Then Begin
  893.                      Sound(300);
  894.                      Delay(500);
  895.                      Sound(277);
  896.                      Delay(1000);
  897.                      NoSound;
  898.                   End;
  899.                 If ((PARAM_DATA.VISUAL_REINFORCE = 1) Or
  900.                   ((PARAM_DATA.VISUAL_REINFORCE = 2) And (HIT_FLAG)) Or
  901.                   ((PARAM_DATA.VISUAL_REINFORCE = 3) And (Not HIT_FLAG)))
  902.                   Then
  903.                   Begin
  904.                      Case SELECTS_RAND_NOS[TARGET] Of
  905.                         1 : PutImage(X_POS,Y_POS,CARD_1^,0);
  906.                         2 : PutImage(X_POS,Y_POS,CARD_2^,0);
  907.                         3 : PutImage(X_POS,Y_POS,CARD_3^,0);
  908.                         4 : PutImage(X_POS,Y_POS,CARD_4^,0);
  909.                         5 : PutImage(X_POS,Y_POS,CARD_5^,0);
  910.                      End;  { Case  }
  911.                      Delay(1500);
  912.                   End;
  913.               If (PARAM_DATA.SOUND_REINFORCE = 4) Then
  914.                  Delay(1500);
  915.               D_TARGET :=  Char(TARGET + 48);
  916.               D_GUESS := TEST_CHOICE;
  917.               If HIT_FLAG Then D_HIT_MISS := 'H'
  918.               Else D_HIT_MISS := 'M';
  919.               D_COLOR_OF_CARD := PARAM_DATA.COLOR_OF_CARD;
  920.               D_SCREEN_DISPLAY1 := Char(SELECTS_RAND_NOS[1] + 48);
  921.               D_SCREEN_DISPLAY2 := Char(SELECTS_RAND_NOS[2] + 48);
  922.               D_SCREEN_DISPLAY3 := Char(SELECTS_RAND_NOS[3] + 48);
  923.               D_SCREEN_DISPLAY4 := Char(SELECTS_RAND_NOS[4] + 48);
  924.               D_SCREEN_DISPLAY5 := Char(SELECTS_RAND_NOS[5] + 48);
  925.               D_REINFORCE_VISUAL := Char(PARAM_DATA.VISUAL_REINFORCE + 48);
  926.               D_REINFORCE_SOUND := CHAR(PARAM_DATA.SOUND_REINFORCE + 48);
  927.               D_STYLE := PARAM_DATA.TYPE_TEST;
  928.               D_ELAPESED_SEC  := ELAPESED_SEC;
  929.               INDEX := 1;
  930.               Repeat
  931.                  If PARAM_DATA.GUESS_FILE_NAME[INDEX] <> '.' Then
  932.                     Begin
  933.                     Case INDEX Of
  934.                       1: D_NAME1 := PARAM_DATA.GUESS_FILE_NAME[1];
  935.                       2: D_NAME2 := PARAM_DATA.GUESS_FILE_NAME[2];
  936.                       3: D_NAME3 := PARAM_DATA.GUESS_FILE_NAME[3];
  937.                       4: D_NAME4 := PARAM_DATA.GUESS_FILE_NAME[4];
  938.                       5: D_NAME5 := PARAM_DATA.GUESS_FILE_NAME[5];
  939.                       6: D_NAME6 := PARAM_DATA.GUESS_FILE_NAME[6];
  940.                       7: D_NAME7 := PARAM_DATA.GUESS_FILE_NAME[7];
  941.                       8: D_NAME8 := PARAM_DATA.GUESS_FILE_NAME[8];
  942.                    End;
  943.                  End
  944.                  Else
  945.                     Begin
  946.                      For INDEX2 := INDEX To 8 Do
  947.                         Case INDEX2 Of
  948.                           1: D_NAME1 := ' ';
  949.                           2: D_NAME2 := ' ';
  950.                           3: D_NAME3 := ' ';
  951.                           4: D_NAME4 := ' ';
  952.                           5: D_NAME5 := ' ';
  953.                           6: D_NAME6 := ' ';
  954.                           7: D_NAME7 := ' ';
  955.                           8: D_NAME8 := ' ';
  956.                        End;
  957.                     INDEX := 8;
  958.                     End;
  959.                  INDEX := INDEX + 1;
  960.               Until (INDEX > 8);
  961.               WRITE_OK := True;
  962.               SAVESCORE(WRITE_OK,D_TARGET,D_GUESS,D_HIT_MISS,
  963.                         D_COLOR_OF_CARD,
  964.                         D_SCREEN_DISPLAY1,D_SCREEN_DISPLAY2,
  965.                         D_SCREEN_DISPLAY3,D_SCREEN_DISPLAY4,
  966.                         D_SCREEN_DISPLAY5,D_REINFORCE_SOUND,
  967.                         D_REINFORCE_VISUAL,D_STYLE,D_CUR_YEAR,
  968.                         D_CUR_MONTH,D_CUR_DAY,D_START_HOUR,
  969.                         D_START_MIN,D_START_SEC,D_ELAPESED_SEC,
  970.                         D_NAME1,D_NAME2,D_NAME3,D_NAME4,D_NAME5,
  971.                         D_NAME6,D_NAME7,D_NAME8);
  972.  
  973.            End;       { If TEST CHOICE <> 'Q' }
  974.            If Not WRITE_OK Then
  975.               begin
  976.               TEST_CHOICE := 'Q';
  977.               TEST_SELECTION := 'Y';
  978.               MAIN_SELECTION := 'Q';
  979.               end;
  980.            ClearDevice;
  981.        Until ((TEST_CHOICE = 'Q') Or (TEST_CALL = 25));
  982.        TEST_SELECTION := 'Y'
  983.     End;                                   {TEST}
  984.     Procedure PROPORTIONS;
  985.     {**********************************************************}
  986.     {**                                                      **}
  987.     {**   PROPORTIONS                                        **}
  988.     {**                                                      **}
  989.     {**********************************************************}
  990.     Var ANSWER : Char;
  991.         OKAY_FLAG : Boolean;
  992.         FOUND_FLAG : Boolean;
  993.         INDEX : Byte;
  994.         INDEX2 : Byte;
  995.         D_NAME1,D_NAME2,D_NAME3,D_NAME4 : Char;
  996.         D_NAME5,D_NAME6,D_NAME7,D_NAME8 : Char;
  997.         HIT_I_1,HIT_I_2,HIT_I_3,HIT_I_4,HIT_I_5: Word;
  998.         HIT_P_1,HIT_P_2,HIT_P_3,HIT_P_4,HIT_P_5: Word;
  999.         TRIAL_I_1,TRIAL_I_2,TRIAL_I_3,TRIAL_I_4,TRIAL_I_5: Word;
  1000.         TRIAL_P_1,TRIAL_P_2,TRIAL_P_3,TRIAL_P_4,TRIAL_P_5: Word;
  1001.         TIME_SHORT_HIT: Word;
  1002.         TIME_LONG_HIT: Word;
  1003.         TIME_SHORT_TRIAL: Word;
  1004.         TIME_LONG_TRIAL: Word;
  1005.         NUMBER_STRING: String[18];
  1006.         TEST_STRING:String[18];
  1007.         TOTAL_HITS,TOTAL_TRIALS : Word;
  1008.         AVER_HIT, AVER_TRIAL,AVER_MISS,REAL_TEMP : Real;
  1009.         TOTAL_ATTEMPTS, TOTAL_MISSES,HIT_RATIO,MISS_RATIO : Real;
  1010.         CELL_1_H,CELL_2_H,CELL_3_H,CELL_4_H,CELL_5_H:Real;
  1011.         CELL_1_T,CELL_2_T,CELL_3_T,CELL_4_T,CELL_5_T:Real;
  1012.         CHI_SQUARE, SHORT_TIME, LONG_TIME : Real;
  1013.         PROB_C, PROB_B ,CHI_SQ : Real;
  1014.     Begin                                  {ANALYSIS}
  1015.        ClearDevice;
  1016.        INDEX := 1;
  1017.        Repeat
  1018.           If PARAM_DATA.GUESS_FILE_NAME[INDEX] <> '.' Then
  1019.           Begin
  1020.              Case INDEX Of
  1021.                 1: D_NAME1 := PARAM_DATA.GUESS_FILE_NAME[1];
  1022.                 2: D_NAME2 := PARAM_DATA.GUESS_FILE_NAME[2];
  1023.                 3: D_NAME3 := PARAM_DATA.GUESS_FILE_NAME[3];
  1024.                 4: D_NAME4 := PARAM_DATA.GUESS_FILE_NAME[4];
  1025.                 5: D_NAME5 := PARAM_DATA.GUESS_FILE_NAME[5];
  1026.                 6: D_NAME6 := PARAM_DATA.GUESS_FILE_NAME[6];
  1027.                 7: D_NAME7 := PARAM_DATA.GUESS_FILE_NAME[7];
  1028.                 8: D_NAME8 := PARAM_DATA.GUESS_FILE_NAME[8];
  1029.              End;
  1030.           End
  1031.           Else
  1032.           Begin
  1033.              For INDEX2 := INDEX To 8 Do
  1034.                 Case INDEX2 Of
  1035.                    1: D_NAME1 := ' ';
  1036.                    2: D_NAME2 := ' ';
  1037.                    3: D_NAME3 := ' ';
  1038.                    4: D_NAME4 := ' ';
  1039.                    5: D_NAME5 := ' ';
  1040.                    6: D_NAME6 := ' ';
  1041.                    7: D_NAME7 := ' ';
  1042.                    8: D_NAME8 := ' ';
  1043.                 End;
  1044.              INDEX := 8;
  1045.            End;
  1046.            INDEX := INDEX + 1;
  1047.        Until (INDEX > 8);
  1048.        GET_RATIOS(HIT_I_1,HIT_I_2,HIT_I_3,HIT_I_4,HIT_I_5,
  1049.                   HIT_P_1,HIT_P_2,HIT_P_3,HIT_P_4,HIT_P_5,
  1050.                   TRIAL_I_1,TRIAL_I_2,TRIAL_I_3,TRIAL_I_4,TRIAL_I_5,
  1051.                   TRIAL_P_1,TRIAL_P_2,TRIAL_P_3,TRIAL_P_4,TRIAL_P_5,
  1052.                   TIME_SHORT_HIT,TIME_LONG_HIT,TIME_SHORT_TRIAL,
  1053.                   TIME_LONG_TRIAL,FOUND_FLAG,D_NAME1,D_NAME2,
  1054.                   D_NAME3,D_NAME4,D_NAME5,D_NAME6,D_NAME7,D_NAME8);
  1055.        If FOUND_FLAG Then
  1056.        Begin
  1057.           USE_SMALL_FONT;
  1058.           BOXES;
  1059.           Str(HIT_I_1,NUMBER_STRING);
  1060.           MoveTo(60,35);
  1061.           OutText(NUMBER_STRING);
  1062.           Str(HIT_I_2,NUMBER_STRING);
  1063.           MoveTo(100,35);
  1064.           OutText(NUMBER_STRING);
  1065.           Str(HIT_I_3,NUMBER_STRING);
  1066.           MoveTo(140,35);
  1067.           OutText(NUMBER_STRING);
  1068.           Str(HIT_I_4,NUMBER_STRING);
  1069.           MoveTo(180,35);
  1070.           OutText(NUMBER_STRING);
  1071.           Str(HIT_I_5,NUMBER_STRING);
  1072.           MoveTo(220,35);
  1073.           OutText(NUMBER_STRING);
  1074.  
  1075.           Str((TRIAL_I_1 - HIT_I_1),NUMBER_STRING);
  1076.           MoveTo(60,55);
  1077.           OutText(NUMBER_STRING);
  1078.           Str((TRIAL_I_2 - HIT_I_2),NUMBER_STRING);
  1079.           MoveTo(100,55);
  1080.           OutText(NUMBER_STRING);
  1081.           Str((TRIAL_I_3 - HIT_I_3),NUMBER_STRING);
  1082.           MoveTo(140,55);
  1083.           OutText(NUMBER_STRING);
  1084.           Str((TRIAL_I_4 - HIT_I_4),NUMBER_STRING);
  1085.           MoveTo(180,55);
  1086.           OutText(NUMBER_STRING);
  1087.           Str((TRIAL_I_5 - HIT_I_5),NUMBER_STRING);
  1088.           MoveTo(220,55);
  1089.           OutText(NUMBER_STRING);
  1090.  
  1091.        TOTAL_HITS := HIT_I_1 + HIT_I_2 + HIT_I_3 + HIT_I_4 + HIT_I_5;
  1092.        TOTAL_TRIALS :=
  1093.            TRIAL_I_1 + TRIAL_I_2 + TRIAL_I_3 + TRIAL_I_4 + TRIAL_I_5;
  1094.        TOTAL_MISSES := TOTAL_TRIALS - TOTAL_HITS;
  1095.        HIT_RATIO := TOTAL_HITS / TOTAL_TRIALS;
  1096.        MISS_RATIO := TOTAL_MISSES / TOTAL_TRIALS;
  1097.        AVER_HIT := TRIAL_I_1 * HIT_RATIO;
  1098.        If AVER_HIT > 0 Then
  1099.           CELL_1_H := Sqr(Abs(HIT_I_1 - AVER_HIT)) / AVER_HIT
  1100.        Else CELL_1_H := 0;
  1101.        AVER_HIT := TRIAL_I_2 * HIT_RATIO;
  1102.        If AVER_HIT > 0 Then
  1103.           CELL_2_H := Sqr(Abs(HIT_I_2 - AVER_HIT)) / AVER_HIT
  1104.        Else CELL_2_H := 0;
  1105.        AVER_HIT := TRIAL_I_3 * HIT_RATIO;
  1106.        If AVER_HIT > 0 Then
  1107.           CELL_3_H := Sqr(Abs(HIT_I_3 - AVER_HIT)) / AVER_HIT
  1108.        Else CELL_3_H := 0;
  1109.        AVER_HIT := TRIAL_I_4 * HIT_RATIO;
  1110.        If AVER_HIT > 0 Then
  1111.           CELL_4_H := Sqr(Abs(HIT_I_4 - AVER_HIT)) / AVER_HIT
  1112.        Else CELL_4_H := 0;
  1113.        AVER_HIT := TRIAL_I_5 * HIT_RATIO;
  1114.        If AVER_HIT > 0 Then
  1115.           CELL_5_H := Sqr(Abs(HIT_I_5 - AVER_HIT)) / AVER_HIT
  1116.        Else CELL_5_H := 0;
  1117.        AVER_MISS := TRIAL_I_1 * MISS_RATIO;
  1118.        If AVER_MISS > 0 Then
  1119.           CELL_1_T := Sqr(Abs((TRIAL_I_1 - HIT_I_1) - AVER_MISS))
  1120.              / AVER_MISS
  1121.        Else CELL_1_T := 0;
  1122.        AVER_MISS := TRIAL_I_2 * MISS_RATIO;
  1123.        If AVER_MISS > 0 Then
  1124.           CELL_2_T := Sqr(Abs((TRIAL_I_2 - HIT_I_2) - AVER_MISS))
  1125.             / AVER_MISS
  1126.        Else CELL_2_T := 0;
  1127.        AVER_MISS := TRIAL_I_3 * MISS_RATIO;
  1128.        If AVER_MISS > 0 Then
  1129.           CELL_3_T := Sqr(Abs((TRIAL_I_3 - HIT_I_3) - AVER_MISS))
  1130.              / AVER_MISS
  1131.        Else CELL_3_T := 0;
  1132.        AVER_MISS := TRIAL_I_4 * MISS_RATIO;
  1133.        If AVER_MISS > 0 Then
  1134.           CELL_4_T := Sqr(Abs((TRIAL_I_4 - HIT_I_4) - AVER_MISS))
  1135.               / AVER_MISS
  1136.        Else CELL_4_T := 0;
  1137.        AVER_MISS := TRIAL_I_5 * MISS_RATIO;
  1138.        If AVER_MISS > 0 Then
  1139.           CELL_5_T := Sqr(Abs((TRIAL_I_5 - HIT_I_5) - AVER_MISS))
  1140.              / AVER_MISS
  1141.        Else CELL_5_T := 0;
  1142.        CHI_SQUARE := CELL_1_H + CELL_2_H + CELL_3_H + CELL_4_H + CELL_5_H +
  1143.          CELL_1_T + CELL_2_T + CELL_3_T + CELL_4_T + CELL_5_T;
  1144.        Str(CHI_SQUARE:6:3,REAL_STRING);
  1145.        MoveTo( 255,5);
  1146.        OutText('X  = '+REAL_STRING);
  1147.        MoveTo(262,0);
  1148.        OutText('2');
  1149.        MoveTo(255,15);
  1150.        OutText('This has a ');
  1151.        MoveTo(252,25);
  1152.        OutText('Significance');
  1153.        MoveTo(255,35);
  1154.        PROB_C := 0;
  1155.        CHISQUARE(PROB_C,CHI_SQUARE,4);
  1156.        REAL_TEMP := PROB_C;
  1157.        Str(REAL_TEMP:6:3,REAL_STRING);
  1158.        OutText('= '+REAL_STRING);
  1159.        MoveTo(255,45);
  1160.        OutText('for your');
  1161.        MoveTo(255,55);
  1162.        OutText('proportion');
  1163.        MoveTo(255,65);
  1164.        OutText('by targets.');
  1165.        Str(HIT_P_1,NUMBER_STRING);
  1166.           MoveTo(60,90);
  1167.           OutText(NUMBER_STRING);
  1168.           Str(HIT_P_2,NUMBER_STRING);
  1169.           MoveTo(100,90);
  1170.           OutText(NUMBER_STRING);
  1171.           Str(HIT_P_3,NUMBER_STRING);
  1172.           MoveTo(140,90);
  1173.           OutText(NUMBER_STRING);
  1174.           Str(HIT_P_4,NUMBER_STRING);
  1175.           MoveTo(180,90);
  1176.           OutText(NUMBER_STRING);
  1177.           Str(HIT_P_5,NUMBER_STRING);
  1178.           MoveTo(220,90);
  1179.           OutText(NUMBER_STRING);
  1180.  
  1181.           Str((TRIAL_P_1 - HIT_P_1),NUMBER_STRING);
  1182.           MoveTo(60,110);
  1183.           OutText(NUMBER_STRING);
  1184.           Str((TRIAL_P_2 - HIT_P_2),NUMBER_STRING);
  1185.           MoveTo(100,110);
  1186.           OutText(NUMBER_STRING);
  1187.           Str((TRIAL_P_3 - HIT_P_3),NUMBER_STRING);
  1188.           MoveTo(140,110);
  1189.           OutText(NUMBER_STRING);
  1190.           Str((TRIAL_P_4 - HIT_P_4),NUMBER_STRING);
  1191.           MoveTo(180,110);
  1192.           OutText(NUMBER_STRING);
  1193.           Str((TRIAL_P_5 - HIT_P_5),NUMBER_STRING);
  1194.           MoveTo(220,110);
  1195.           OutText(NUMBER_STRING);
  1196.  
  1197.        TOTAL_HITS := HIT_P_1 + HIT_P_2 + HIT_P_3 + HIT_P_4 + HIT_P_5;
  1198.        TOTAL_TRIALS :=
  1199.            TRIAL_P_1 + TRIAL_P_2 + TRIAL_P_3 + TRIAL_P_4 + TRIAL_P_5;
  1200.        TOTAL_MISSES := TOTAL_TRIALS - TOTAL_HITS;
  1201.        HIT_RATIO := TOTAL_HITS / TOTAL_TRIALS;
  1202.        MISS_RATIO := TOTAL_MISSES / TOTAL_TRIALS;
  1203.        AVER_HIT := TRIAL_P_1 * HIT_RATIO;
  1204.        If AVER_HIT > 0 Then
  1205.           CELL_1_H := Sqr(Abs(HIT_P_1 - AVER_HIT)) / AVER_HIT
  1206.        Else CELL_1_H := 0;
  1207.        AVER_HIT := TRIAL_P_2 * HIT_RATIO;
  1208.        If AVER_HIT > 0 Then
  1209.           CELL_2_H := Sqr(Abs(HIT_P_2 - AVER_HIT)) / AVER_HIT
  1210.        Else CELL_2_H := 0;
  1211.        AVER_HIT := TRIAL_P_3 * HIT_RATIO;
  1212.        If AVER_HIT > 0 Then
  1213.           CELL_3_H := Sqr(Abs(HIT_P_3 - AVER_HIT)) / AVER_HIT
  1214.        Else cell_3_h := 0;
  1215.        AVER_HIT := TRIAL_P_4 * HIT_RATIO;
  1216.        If AVER_HIT > 0 Then
  1217.           CELL_4_H := Sqr(Abs(HIT_P_4 - AVER_HIT)) / AVER_HIT
  1218.        Else CELL_4_H := 0;
  1219.        AVER_HIT := TRIAL_P_5 * HIT_RATIO;
  1220.        If AVER_HIT > 0 Then
  1221.           CELL_5_H := Sqr(Abs(HIT_P_5 - AVER_HIT)) / AVER_HIT
  1222.        Else CELL_5_H := 0;
  1223.        AVER_MISS := TRIAL_P_1 * MISS_RATIO;
  1224.        If AVER_MISS > 0 Then
  1225.           CELL_1_T := Sqr(Abs((TRIAL_P_1 - HIT_P_1) - AVER_MISS))
  1226.                 / AVER_MISS
  1227.        Else CELL_1_T := 0;
  1228.        AVER_MISS := TRIAL_P_2 * MISS_RATIO;
  1229.        If AVER_MISS > 0 Then
  1230.           CELL_2_T := Sqr(Abs((TRIAL_P_2 - HIT_P_2) - AVER_MISS))
  1231.                 / AVER_MISS
  1232.        Else CELL_2_T := 0;
  1233.        AVER_MISS := TRIAL_P_3 * MISS_RATIO;
  1234.        If AVER_MISS > 0 Then
  1235.           CELL_3_T := Sqr(Abs((TRIAL_P_3 - HIT_P_3) - AVER_MISS))
  1236.                 / AVER_MISS
  1237.        Else CELL_3_T := 0;
  1238.        AVER_MISS := TRIAL_P_4 * MISS_RATIO;
  1239.        If AVER_MISS > 0 Then
  1240.           CELL_4_T := Sqr(Abs((TRIAL_P_4 - HIT_P_4) - AVER_MISS))
  1241.                 / AVER_MISS
  1242.        Else CELL_4_T := 0;
  1243.        AVER_MISS := TRIAL_P_5 * MISS_RATIO;
  1244.        If AVER_MISS > 0 Then
  1245.           CELL_5_T := Sqr(Abs((TRIAL_P_5 - HIT_P_5) - AVER_MISS))
  1246.                 / AVER_MISS
  1247.        Else CELL_5_T := 0;
  1248.        CHI_SQUARE := CELL_1_H + CELL_2_H + CELL_3_H + CELL_4_H + CELL_5_H +
  1249.          CELL_1_T + CELL_2_T + CELL_3_T + CELL_4_T + CELL_5_T;
  1250.  
  1251.           Str(CHI_SQUARE:6:3,REAL_STRING);
  1252.           MoveTo( 255,95);
  1253.           OutText('X  = '+REAL_STRING);
  1254.           MoveTo(262,90);
  1255.           OutText('2');
  1256.           MoveTo(255,105);
  1257.           OutText('has a ');
  1258.           MoveTo(252,115);
  1259.           OutText('Significance');
  1260.           PROB_C := 0;
  1261.           CHISQUARE(PROB_C,CHI_SQUARE,4);
  1262.           Real_TEMP := PROB_C;
  1263.           Str(REAL_TEMP:6:3,REAL_STRING);
  1264.           MoveTo(255,125);
  1265.           OUTText('= '+REAL_STRING);
  1266.           MoveTo(255,135);
  1267.           OutText('for your');
  1268.           MoveTo(255,145);
  1269.           OutText('proportion');
  1270.           MoveTo(255,155);
  1271.           OutText('by their ');
  1272.           MoveTo(255,165);
  1273.           OutText('positions.');
  1274.  
  1275.           Str(TIME_SHORT_HIT,NUMBER_STRING);
  1276.           MoveTo(60,150);
  1277.           OutText(NUMBER_STRING);
  1278.           Str(TIME_LONG_HIT,NUMBER_STRING);
  1279.           MoveTo(100,150);
  1280.           OutText(NUMBER_STRING);
  1281.  
  1282.           Str((TIME_SHORT_TRIAL-TIME_SHORT_HIT),NUMBER_STRING);
  1283.           MoveTo(60,170);
  1284.           OutText(NUMBER_STRING);
  1285.           Str((TIME_LONG_TRIAL-TIME_LONG_HIT),NUMBER_STRING);
  1286.           MoveTo(100,170);
  1287.           OutText(NUMBER_STRING);
  1288.  
  1289.        TOTAL_HITS := TIME_SHORT_HIT + TIME_LONG_HIT;
  1290.        TOTAL_TRIALS := TIME_SHORT_TRIAL + TIME_LONG_TRIAL;
  1291.        HIT_RATIO := TOTAL_HITS / TOTAL_TRIALS;
  1292.        TOTAL_MISSES := TOTAL_TRIALS - TOTAL_HITS;
  1293.        MISS_RATIO := TOTAL_MISSES / TOTAL_TRIALS;
  1294.        AVER_HIT := TIME_SHORT_TRIAL * HIT_RATIO;
  1295.        If AVER_HIT > 0 Then
  1296.           CELL_1_H := Sqr(Abs(TIME_SHORT_HIT - AVER_HIT)) / AVER_HIT
  1297.        Else CELL_1_H := 0;
  1298.        AVER_HIT := TIME_LONG_TRIAL * HIT_RATIO;
  1299.        If AVER_HIT > 0 Then
  1300.           CELL_2_H := Sqr(Abs(TIME_LONG_HIT - AVER_HIT)) / AVER_HIT
  1301.        Else CELL_2_H := 0;
  1302.        AVER_MISS := TIME_SHORT_TRIAL * MISS_RATIO;
  1303.        If AVER_MISS > 0 Then
  1304.           CELL_1_T := Sqr(Abs((TIME_SHORT_TRIAL - TIME_SHORT_HIT)
  1305.                 - AVER_miss)) / AVER_MISS
  1306.        Else CELL_1_T := 0;
  1307.        AVER_MISS := TIME_LONG_TRIAL * MISS_RATIO;
  1308.        If AVER_MISS > 0  Then
  1309.           CELL_2_T := Sqr(Abs((TIME_LONG_TRIAL - TIME_LONG_HIT)
  1310.                 - AVER_MISS)) / AVER_MISS
  1311.        Else CELL_2_T := 0;
  1312.        CHI_SQUARE := CELL_1_H + CELL_2_H + CELL_1_T + CELL_2_T;
  1313.        Str(CHI_SQUARE:6:3,REAL_STRING);
  1314.        MoveTo( 135,135);
  1315.        OutText('X  = '+REAL_STRING);
  1316.        MoveTo(145,130);
  1317.        OutText('2');
  1318.        MoveTo(215,135);
  1319.        OutText('has a');
  1320.        PROB_C := 0;
  1321.        CHISQUARE(PROB_C,CHI_SQUARE,1);
  1322.        REAL_TEMP := PROB_C;
  1323.        Str(REAL_TEMP:6:3,REAL_STRING);
  1324.        MoveTo(135,145);
  1325.        OutText('Significance ');
  1326.        MoveTo(135,155);
  1327.        OutText('= '+REAL_STRING+' for the');
  1328.        MoveTo(135,165);
  1329.        OutText('long vs short times ');
  1330.        MoveTo(135,175);
  1331.        OutText('you''ve taken.');
  1332.        OKAY_FLAG := False;
  1333.        Repeat
  1334.           ANSWER := UpCase(readkey);
  1335.           If ANSWER In ['Q'] Then
  1336.              OKAY_FLAG := True
  1337.           Else
  1338.              ERROR('  Must be Q ');
  1339.        Until OKAY_FLAG;
  1340.     End {** IF FOUND FLAG **}
  1341.     End;                                   {ANALYSIS}
  1342.  
  1343.     Procedure ANALYSIS(Var ANALYSIS_SELECTION : Char);
  1344.     {**********************************************************}
  1345.     {**                                                      **}
  1346.     {**   ANALYSIS                                           **}
  1347.     {**                                                      **}
  1348.     {**********************************************************}
  1349.     Var TRIALS: Word;
  1350.         HITS : Word;
  1351.         ARGUMENT : Real;
  1352.         TEST_HITS : LongInt;
  1353.         TEST_N_P : LongInt;
  1354.         PROB_B : Real;
  1355.         STRING3 : String[3];
  1356.         STRING2 : String[2];
  1357.         TRIALS_STRING : String[5];
  1358.         HITS_STRING : String[5];
  1359.         PER_CENT_STR : String[2];
  1360.         WORK_PROB : Real;
  1361.         INT_PROB : Integer;
  1362.         TEMP_PROB : Real;
  1363.         X_OVER_N : Real;
  1364.         HIT_RATIO : Real;
  1365.         MISS_RATIO : Real;
  1366.         AVER_HIT : Real;
  1367.         AVER_MISS : Real;
  1368.         CELL_1_H, CELL_2_H,CELL_1_T,CELL_2_T : Real;
  1369.         CHI_SQUARE : Real;
  1370.         ANSWER : Char;
  1371.         HIGH_HITS : Integer;
  1372.         LOW_HITS : Integer;
  1373.         TOTAL_HITS : Real;
  1374.         TOTAL_MISSES : Real;
  1375.         TOTAL_TRIALS : Real;
  1376.         PROB_C : Real;
  1377.         OKAY_FLAG : Boolean;
  1378.         FOUND_FLAG : Boolean;
  1379.         INDEX : Byte;
  1380.         INDEX2 : Byte;
  1381.         D_NAME1 : Char;
  1382.         D_NAME2 : Char;
  1383.         D_NAME3 : Char;
  1384.         D_NAME4 : Char;
  1385.         D_NAME5 : Char;
  1386.         D_NAME6 : Char;
  1387.         D_NAME7 : Char;
  1388.         D_NAME8 : Char;
  1389.     Begin                                  {ANALYSIS}
  1390.        ClearDevice;
  1391.        INDEX := 1;
  1392.        Repeat
  1393.           If PARAM_DATA.GUESS_FILE_NAME[INDEX] <> '.' Then
  1394.           Begin
  1395.              Case INDEX Of
  1396.                 1: D_NAME1 := PARAM_DATA.GUESS_FILE_NAME[1];
  1397.                 2: D_NAME2 := PARAM_DATA.GUESS_FILE_NAME[2];
  1398.                 3: D_NAME3 := PARAM_DATA.GUESS_FILE_NAME[3];
  1399.                 4: D_NAME4 := PARAM_DATA.GUESS_FILE_NAME[4];
  1400.                 5: D_NAME5 := PARAM_DATA.GUESS_FILE_NAME[5];
  1401.                 6: D_NAME6 := PARAM_DATA.GUESS_FILE_NAME[6];
  1402.                 7: D_NAME7 := PARAM_DATA.GUESS_FILE_NAME[7];
  1403.                 8: D_NAME8 := PARAM_DATA.GUESS_FILE_NAME[8];
  1404.              End;
  1405.           End
  1406.           Else
  1407.           Begin
  1408.              For INDEX2 := INDEX To 8 Do
  1409.                 Case INDEX2 Of
  1410.                    1: D_NAME1 := ' ';
  1411.                    2: D_NAME2 := ' ';
  1412.                    3: D_NAME3 := ' ';
  1413.                    4: D_NAME4 := ' ';
  1414.                    5: D_NAME5 := ' ';
  1415.                    6: D_NAME6 := ' ';
  1416.                    7: D_NAME7 := ' ';
  1417.                    8: D_NAME8 := ' ';
  1418.                 End;
  1419.              INDEX := 8;
  1420.           End;
  1421.           INDEX := INDEX + 1;
  1422.        Until (INDEX > 8);
  1423.        TRIALS := 0;
  1424.        HITS := 0;
  1425.        GETSCORE(HITS,TRIALS,FOUND_FLAG,D_NAME1,D_NAME2,
  1426.           D_NAME3,D_NAME4,D_NAME5,D_NAME6,D_NAME7,D_NAME8);
  1427.        If FOUND_FLAG Then
  1428.        Begin
  1429.           PROB_B := 0;
  1430.           USE_SMALL_FONT;
  1431.           MoveTo(0,0);
  1432.           Str(TRIALS,TRIALS_STRING);
  1433.           OutText('You have made '+TRIALS_STRING+' attemps');
  1434.           MoveTo(0,15);
  1435.           Str(HITS,HITS_STRING);
  1436.           WORK_REAL := HITS / TRIALS;
  1437.           Str(WORK_REAL:6:3,REAL_STRING);
  1438.           OutText(
  1439.    'You have been successful '+HITS_STRING+' times; a '+REAL_string+' ratio');
  1440.           MoveTo(0,30);
  1441.           TEST_HITS := HITS * 10;
  1442.           TEST_N_P := TRIALS * 2;
  1443.           If (TEST_N_P < TEST_HITS) Then
  1444.           Begin
  1445.              OutText('To have '+HITS_STRING+' hits or more out of '+
  1446.                 TRIALS_STRING+' has a');
  1447.              HITS := HITS - 1;
  1448.              BINOMIAL(PROB_B,TRIALS,HITS);
  1449.              PROB_B := 1.0 - PROB_B;
  1450.              HITS := HITS + 1;
  1451.           End;
  1452.           If ((TEST_N_P > TEST_HITS) Or
  1453.              (TEST_N_P = TEST_HITS)) Then
  1454.           Begin
  1455.              OutText('To have '+HITS_STRING+' hits or less out of '+
  1456.                 TRIALS_STRING+' has a');
  1457.              BINOMIAL(PROB_B,TRIALS,HITS);
  1458.           End;
  1459.           USE_ROMAN_FONT;
  1460.           Str(PROB_B:5:3,REAL_STRING);
  1461.           MoveTo(0,45);
  1462.           OutText('Probability of '+REAL_STRING);
  1463.           USE_SMALL_FONT;
  1464.           {***  Compute CHI-SQUARE  ***}
  1465.           TOTAL_HITS := (TRIALS * 0.2) + HITS;
  1466.           TOTAL_TRIALS := TRIALS * 2;
  1467.           HIT_RATIO := TOTAL_HITS / TOTAL_TRIALS;
  1468.           TOTAL_MISSES := (TRIALS * 0.8) +
  1469.                             TRIALS - HITS;
  1470.           MISS_RATIO := TOTAL_MISSES / TOTAL_TRIALS;
  1471.           If HIT_RATIO > 0 Then Begin
  1472.              AVER_HIT := TRIALS * HIT_RATIO;
  1473.              CELL_1_H := Sqr(Abs((0.2 * TRIALS) - AVER_HIT)) / AVER_HIT;
  1474.              CELL_2_H := Sqr(Abs(hits - AVER_HIT)) / AVER_HIT;
  1475.           End
  1476.           Else Begin
  1477.             CELL_1_H := 0;
  1478.             CELL_2_H := 0;
  1479.           End;
  1480.           If MISS_RATIO > 0 Then Begin
  1481.              AVER_MISS := TRIALS * MISS_RATIO;
  1482.              CELL_1_T := Sqr(Abs((0.8 * TRIALS) - AVER_MISS)) / AVER_MISS;
  1483.              CELL_2_T := Sqr(Abs((TRIALS - HITS) - AVER_MISS)) / AVER_MISS;
  1484.           End
  1485.           Else Begin
  1486.             CELL_1_T := 0;
  1487.             CELL_2_T := 0;
  1488.           End;
  1489.           CHI_SQUARE := CELL_1_H + CELL_2_H + CELL_1_T + CELL_2_T;
  1490.           Str(CHI_SQUARE:6:3,REAL_STRING);
  1491.           MoveTo(0,80);
  1492.           OutText('The Chi-Square test shows:');
  1493.           MoveTo( 0,100);
  1494.           OutText('X  = '+REAL_STRING);
  1495.           MoveTo(10,95);
  1496.           OutText('2');
  1497.           PROB_C := 0;
  1498.           CHISQUARE(PROB_C,CHI_SQUARE,1);
  1499.           Str(PROB_C:6:3,REAL_STRING);
  1500.           MoveTo(0,120);
  1501.           OutText('You have a '+real_string+' significance');
  1502.           MoveTo(40,140);
  1503.           OutText('for this test of your');
  1504.           MoveTo(170,134);
  1505.           USE_ROMAN_FONT;
  1506.           If ((HITS / TRIALS) > 0.2 ) Then
  1507.              OutText('ESP')
  1508.           Else
  1509.              OutText('Psi-missing');
  1510.           USE_SMALL_FONT;
  1511.           MoveTo(0,180);
  1512.           OutText(' Enter Q to QUIT Analysis; enter M for MORE Analysis');
  1513.           OKAY_FLAG := False;
  1514.           Repeat
  1515.              ANALYSIS_SELECTION := UpCase(readkey);
  1516.              If ANALYSIS_SELECTION In ['Q','M'] Then
  1517.                 OKAY_FLAG := True
  1518.              Else
  1519.                 ERROR('  Must be Q  or M');
  1520.           Until OKAY_FLAG;
  1521.           If ANALYSIS_SELECTION = 'M' Then
  1522.              PROPORTIONS;
  1523.           If ANALYSIS_SELECTION = 'Q' Then
  1524.              ANALYSIS_SELECTION := 'Y';
  1525.        End {** IF FOUND FLAG **}
  1526.     Else
  1527.       ANALYSIS_SELECTION := 'Y';
  1528.     End;                                   {ANALYSIS}
  1529.  
  1530. {**********************************************************}
  1531. {**                                                      **}
  1532. {**   PROCEDURE MAIN_MENU displays the main menu and     **}
  1533. {**   accepts a choice                                   **}
  1534. {**                                                      **}
  1535. {**********************************************************}
  1536. Var CHANGE_SELECTION : Char;
  1537.     TEST_SELECTION : Char;
  1538.     ANALYSIS_SELECTION : Char;
  1539.     OKAY_FLAG : Boolean;
  1540. Begin                                  { main_menu }
  1541.    If MAIN_SELECTION <> 'X' Then
  1542.       ClearDevice;
  1543.    PutImage(0,0,MENU_SCREEN^,0);
  1544.  
  1545.  
  1546.    CHANGE_SELECTION := 'X';
  1547.    TEST_SELECTION := 'X';
  1548.    ANALYSIS_SELECTION :=  'X';
  1549.    OKAY_FLAG := False;
  1550.    Repeat
  1551.       MAIN_SELECTION := UpCase(readkey);
  1552.       If MAIN_SELECTION In ['I','C','T','A','Q'] Then
  1553.          OKAY_FLAG := True
  1554.       Else
  1555.          ERROR('  Must be I C T A or Q  ');
  1556.    Until OKAY_FLAG;
  1557.    Case MAIN_SELECTION Of
  1558.       'I'  :  Begin
  1559.                  ClearDevice;
  1560.                  USE_ROMAN_FONT;
  1561.                  MoveTo(0,0);
  1562.                  OutText('         ESPTEST');
  1563.                  USE_SMALL_FONT;
  1564.                  PROGRAM_INFO;
  1565.               End;
  1566.       'C'  :  Begin
  1567.                  While CHANGE_SELECTION <> 'Q' Do Begin
  1568.                     CHANGE_DEFAULTS(CHANGE_SELECTION);
  1569.                  End;
  1570.               End;
  1571.       'T'  :  Begin
  1572.                  While TEST_SELECTION <> 'Y' Do Begin
  1573.                     TEST(TEST_SELECTION);
  1574.                  End;
  1575.               End;
  1576.       'A'  :  Begin
  1577.                  While ANALYSIS_SELECTION <> 'Y' Do Begin
  1578.                     ANALYSIS(ANALYSIS_SELECTION);
  1579.                  End;
  1580.               End;
  1581.       'Q'  :  Begin
  1582.               End;
  1583.       End;
  1584. End;                                   { Main_menu  }
  1585.  
  1586. {*********************************************************}
  1587. {**                                                     **}
  1588. {**   This is the main program                          **}
  1589. {**                                                     **}
  1590. {*********************************************************}
  1591. Var MAIN_SELECTION: Char;
  1592. Begin                                            {ESP_TEST}
  1593.     INITIALIZE;
  1594.     TITLE;
  1595.     MAKE_MENU;
  1596.     GETIMAGE(0,0,26,26,SELECT_1^);
  1597.     GETIMAGE(49,0,75,26,SELECT_2^);
  1598.     GETIMAGE(98,0,124,26,SELECT_3^);
  1599.     GETIMAGE(148,0,174,26,SELECT_4^);
  1600.     GETIMAGE(197,0,223,26,SELECT_5^);
  1601.     USE_ROMAN_FONT;
  1602.     MoveTo(50,35);
  1603.     OutText('I  Information');
  1604.     MoveTo(50,55);
  1605.     OutText('C  Change defaults');
  1606.     MoveTo(50,75);
  1607.     OutText('T  Test');
  1608.     MoveTo(50,95);
  1609.     OutText('A  Analysis');
  1610.     MoveTo(50,115);
  1611.     OutText('Q  Quit');
  1612.     GetImage(0,0,319,199,MENU_SCREEN^);
  1613.     MAIN_SELECTION := 'X';
  1614.     While MAIN_SELECTION <> 'Q' Do
  1615.        Begin
  1616.           MAIN_MENU(MAIN_SELECTION);
  1617.        End;
  1618.     CloseGraph;
  1619.     RestoreCRTMode;
  1620. End.                                             {ESP_TEST}
  1621.  
  1622.  
  1623.